A smartphone or other mobile computing device has limited resources but is expected to run multiple kinds of software concurrently. In addition to software processes for an operating system, the mobile computing device may be expected to run various combinations of applications at the same time, e.g., different combinations of a turn-by-turn map navigation application, a Web browser, a text messaging application, a voice communication application, an audio playback application, an email reader, calendar application, alarm clock application and/or game.
An application or system process can be considered a workload for the mobile computing device. With limited resources, the mobile computing device decides how to allocate resources such as processor utilization and memory to different workloads. In doing so, the mobile computing device can have competing goals—run as many of the workloads as possible, but provide sufficient resources for each of the workloads. For example, a mobile computing device may attempt to run a turn-by-turn map navigation application in the background while a user is actively using a different application in the foreground, which requires the mobile computing device to allocate sufficient resources so that each application has acceptable performance. If insufficient resources are allocated to a workload, the user may notice degradation in performance for that workload.
In some previous mobile computing devices, an application author or user was essentially free to use the resources of a device with few limits. As a result, a misbehaving application or user who started too many concurrent workloads could cause the performance of the mobile computing device to degrade unacceptably. This could be especially noticeable for the application in the foreground. If an operating system divides resources roughly equally between workloads, the operating system typically tracks the workloads and makes sure that each gets some processor resources and some memory. When there are not enough resources, the performance of applications typically suffers. Some applications may run fine, but others may run slowly or unpredictably, or fail entirely. This problem is especially acute for low-end devices with fewer resources.